package com.ants.project.core.utils;


import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

/**
 * 读取文件
 * 写入文件
 * 文件复制
 * 下载文件
 * 文件重命名
 * 文件转移
 * 文件删除
 * 文件夹遍历
 * Created by liushun on 2016/6/28.
 */
public class FileUtil {


    /**
     * 读取文件可以带缓冲区读取大文件，默认不带缓冲
     *
     * @param fileName 文件名称包含路径
     * @param isBuff   是否缓冲 true:缓冲 false:不缓冲
     * @return
     */
    public static String read(String fileName, boolean isBuff) {
        StringBuffer data = new StringBuffer();
        BufferedReader in = null;
        try {
            if (isBuff)
                in = new BufferedReader(new FileReader(fileName), 5 * 1024 * 1024);
            else
                in = new BufferedReader(new FileReader(fileName));
            String line = "";
            while ((line = in.readLine()) != null) {
                data.append(line);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data.toString();
    }

    public static String read(String fileName) {
        return read(fileName, false);
    }

    /**
     * 下载文件到本地
     *
     * @param urlString 被下载的文件地址
     * @param filename  本地文件名
     */
    public static boolean download(String urlString, String filename) {
        try {
            // 构造URL
            URL url = new URL(urlString);
            // 打开连接
            URLConnection con = url.openConnection();
            // 输入流
            InputStream is = con.getInputStream();
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            // 读取到的数据长度
            int len;
            File file = new File(filename.substring(0, filename.lastIndexOf("/")));
            if (!file.exists())
                file.mkdirs();
            // 输出的文件流
            OutputStream os = new FileOutputStream(filename);
            // 开始读取
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
            // 完毕，关闭所有链接
            os.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 文件复制
     *
     * @param currentFile 当前文件
     * @param targetFile  目标文件
     * @return
     */
    public static boolean copy(String currentFile, String targetFile) {
        FileInputStream in = null;
        try {
            in = new FileInputStream(currentFile);
            File file = new File(targetFile);
            if (!file.exists())
                file.createNewFile();
            FileOutputStream out = new FileOutputStream(file);
            int c;
            byte buffer[] = new byte[1024];
            while ((c = in.read(buffer)) != -1) {
                for (int i = 0; i < c; i++)
                    out.write(buffer[i]);
            }
            in.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 写入文件
     *
     * @param fileName 文件名称
     * @param content  内容
     * @param isAppend 是否追加 true:追加 false:不追加
     * @return
     */
    public static boolean write(String fileName, String content, boolean isAppend) {
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, isAppend)));  //追加的方法
            out.write(content);
            out.write("\r\n");
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    public static boolean write(String fileName, String content) {
        return write(fileName, content, false);
    }

    /**
     * 文件重命名 必须在相同路径下面
     *
     * @param path    文件路径
     * @param oldName 旧文件名称
     * @param newName 新文件名称
     * @return
     */
    public static boolean rename(String path, String oldName, String newName) {
        File file = new File(path + File.separator + oldName);
        if (file.exists()) {
            file.renameTo(new File(path + File.separator + newName));
            return true;
        }
        return false;
    }

    /**
     * 文件删除
     *
     * @param fileName 文件名称
     */
    public static void delete(String fileName) {
        File file = new File(fileName);
        file.delete();
    }


    /**
     * 文件移动 默认覆盖文件
     *
     * @param oldFile 旧文件地址
     * @param newFile 新文件地址
     * @param isCover 是否覆盖 true:是 false:否
     * @return
     */
    public static boolean move(String oldFile, String newFile, boolean isCover) {
        File file = new File(oldFile);
        if (file.exists()) {
            File neile = new File(newFile);
            if (isCover)
                file.renameTo(neile);
            else {
                if (neile.exists())
                    System.out.println(newFile + " > 文件已经存在!");
                else
                    file.renameTo(neile);
            }
            return true;
        }
        return false;
    }

    public static boolean move(String oldFile, String newFile) {
        return move(oldFile, newFile, true);
    }


    /**
     * 遍历文件夹,当路径为文件时遍历同级目录
     *
     * @param folder 文件夹路径
     * @return
     */
    public static List loopFolder(String folder) {
        File f = new File(folder);
        List list = new ArrayList();
        if (f.isDirectory()) {
            File[] files = f.listFiles();
            for (File file : files)
                list.add(file.getAbsolutePath());
            return list;
        } else {
            String newpath = folder.substring(0, folder.lastIndexOf("/") + 1);
            File[] files = new File(newpath).listFiles();
            for (File file : files)
                list.add(file.getAbsolutePath());
            return list;
        }

    }
    
}
